package co.edu.ucatolica.sislab.persistence.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import co.edu.ucatolica.sislab.persistence.DatabaseException;
import co.edu.ucatolica.sislab.persistence.DatabasePersistorHelper;
import co.edu.ucatolica.sislab.persistence.dto.SalaConfiguracionDTO;
import co.edu.ucatolica.sislab.persistence.dto.SalaDTO;
import co.edu.ucatolica.sislab.persistence.utils.DatabaseOperations;
import co.edu.ucatolica.sislab.persistence.utils.PersistenceUtils;
import co.edu.ucatolica.sislab.persistence.utils.SQLSISLABDBConstants;
import co.edu.ucatolica.sislab.utils.DatabaseTables;

public class SalaPersistorHelper {
	
private static Logger logger = LoggerFactory.getLogger(SalaPersistorHelper.class);
	
	public static Long traerSala(Long transactionNumber,SalaDTO salaDTO) throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_TRAER_SALA_DATA);
			
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setString(1, salaDTO.getNombre());															
				ps.execute();
				
				return DatabasePersistorHelper.getIdentity(dbConnection);
			}
		} catch (DatabaseException e) {
			logger.error("No fue posible traer los datos de la tabla salas: " + salaDTO.getNombre() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.SALAS, DatabaseOperations.SELECT, e.toString());
		} catch (SQLException e) {
			logger.error("No fue posible traer los datos de la tabla salas " + salaDTO.getNombre() + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.SALAS, DatabaseOperations.SELECT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;		
	}
	
	public static List<SalaConfiguracionDTO> getSalaConfigurationList(Long transactionNumber, Long salaId) throws DatabaseException {
		Connection dbConnection = null;
		PreparedStatement ps = null;
		try {
			dbConnection = DatabasePersistorHelper.getConexion(transactionNumber);
			String sql = DatabasePersistorHelper.getSql(SQLSISLABDBConstants.SQL_SELECT_SALA_CONFIG);
			
			if ((dbConnection != null) && (sql != null)) {
				ps = dbConnection.prepareStatement(sql);
				ps.setLong(1, salaId);															
				ResultSet rs = ps.executeQuery();
				List<SalaConfiguracionDTO> salaConfiguracionDTOs = new ArrayList<SalaConfiguracionDTO>();
				while(rs.next()){
					SalaConfiguracionDTO salaConfiguracionDTO = new SalaConfiguracionDTO();
					salaConfiguracionDTO.setSalaId(rs.getLong("sala_id"));
					salaConfiguracionDTO.setNumeroFila(rs.getLong("numFila"));
					salaConfiguracionDTO.setConfiguracion(rs.getString("equipos_conf"));
					salaConfiguracionDTOs.add(salaConfiguracionDTO);
				}
				
				return salaConfiguracionDTOs;
			}
		} catch (DatabaseException e) {
			logger.error("No fue posible traer los datos de la configuracion de la salas con id: " + salaId + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.SALAS, DatabaseOperations.SELECT, e.toString());
		} catch (SQLException e) {
			logger.error("No fue posible traer los datos de la configuracion de la salas con id: " + salaId + " - " + e.getMessage());
			throw new DatabaseException(DatabaseTables.SALAS, DatabaseOperations.SELECT, e.toString());
		} finally {
			PersistenceUtils.closeConnectionIssues(ps);
		}
		return null;		
	}

}
